package pe.com.hermes.hermetic.modelo.daoimpl;

import com.ibatis.sqlmap.client.SqlMapClient;

import java.net.InetAddress;

import java.net.UnknownHostException;

import java.sql.SQLException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Repository;

import pe.com.hermes.hermetic.beans.ConfBean;
import pe.com.hermes.hermetic.beans.UsersNivConfBean;
import pe.com.hermes.hermetic.exception.NiveAutoNotFoundException;
import pe.com.hermes.hermetic.exception.TooManyNiveAutoByUsuaException;
import pe.com.hermes.hermetic.modelo.dao.ConfiguracionDAO;

@Repository("configuracionDAO")
public class ConfiguracionDAOImpl implements ConfiguracionDAO {

  @Autowired
  protected JdbcTemplate jdbcTemplate;
  private Logger logger = Logger.getLogger(this.getClass());

  @Autowired
  private SqlMapClient sqlMapClient;    

  public List getListNivConf(String codClieOrig, String codClieDest, String codSucuHTB, String tipProc){
    List list = new ArrayList();
    Map map = new HashMap();
    map.put("P_COD_CLIE_ORIG",codClieOrig);
    map.put("P_COD_CLIE_DEST",codClieDest);
    map.put("P_COD_SUCU_HTB",codSucuHTB);
    map.put("P_TIP_PROC",tipProc);
    int erro = 0;
    try{
        sqlMapClient.queryForObject("getListNivConf",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro==0)
            list=(List)map.get("S_LIST");
        else
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
    }finally{
        return list;      
    }
  }
  
  public int existPedPendAuto(int codClieOrig, int codClieDest, String tipProc, String codSucuHtb){
        int existPedPendAuto;
        existPedPendAuto = 0;
        Map map = new HashMap();
        map.put("P_COD_CLIE_ORIG",codClieOrig);
        map.put("P_COD_CLIE_DEST",codClieDest);
        map.put("P_TIP_PROC",tipProc);
        map.put("P_COD_SUCU_HTB",codSucuHtb);
      try{
          sqlMapClient.queryForObject("existPedPendAuto",map);
          existPedPendAuto = (Integer)map.get("S_EXIST");
      }catch(Exception e){
          existPedPendAuto = 0;
          logger.error(e);
      }
      return existPedPendAuto;
  }
  
  public int saveNivAutConf(ConfBean nivAuto, String usuModi, String compModi){
    Map map = new HashMap();
    map.put("P_COD_CLIE_ORIG", Integer.parseInt(nivAuto.getCodClieOrig()));
    map.put("P_COD_CLIE_DEST",Integer.parseInt(nivAuto.getCodClieDest()));
    map.put("P_NUM_NIVE_AUTO",nivAuto.getNumNivel());
    map.put("P_DES_NIVE_AUTO",nivAuto.getDesNivel());
    map.put("P_TIP_PROC", nivAuto.getCodProceso());
    map.put("P_COD_SUCU_HTB",Integer.parseInt(nivAuto.getCodSucuHtb()));
    map.put("P_NUM_CATE_NIVE",Integer.parseInt(nivAuto.getNumCateNive()));
    map.put("P_COD_USUA",usuModi);
    map.put("P_NOM_COMP",compModi);
    int erro = 0;
    try{
        sqlMapClient.insert("saveNivAutConf",map);
        erro = (Integer)map.get("S_ERRO");
        nivAuto.setCodNivel((Integer)map.get("S_COD_NIVE_AUTO"));
        if(erro!=0)
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
        erro = 1;
    }
    return erro;  
  }

  public int actuNivAutConf(int codNiv, String desNiv,String usuModi,String address){
        Map map = new HashMap();
        map.put("P_COD_NIVE_AUTO",codNiv);
        map.put("P_DES_NIVE_AUTO",desNiv);
        map.put("P_COD_USUA",usuModi);
        map.put("P_NOM_COMP",address);
        int erro = 0;
        try{
            sqlMapClient.insert("actuNivAutConf",map);
            erro = (Integer)map.get("S_ERRO");
            if(erro!=0)
                throw new Exception(map.get("S_MENS").toString());
        }catch(Exception e){
            logger.error(e);
            erro = 1;
        }
        return erro;    
  }
  
  public int delNivAutConf(int codNiv, String usuWeb,String nomComp){
    Map map = new HashMap();
    map.put("P_COD_NIVE_AUTO",codNiv);
    map.put("P_COD_USUA",usuWeb);
    map.put("P_NOM_COMP",nomComp);
    int erro = 0;
    try{
        sqlMapClient.insert("delNivAutConf",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro!=0)
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
        erro = 1;
    }
    return erro;
  }
  
  public int getNextNivAuto(int codClieOrig, int codClieDest, int tipProc, int codSucuHtb, int numCateNive){
    Map map = new HashMap();
    map.put("P_COD_CLIE_ORIG",codClieOrig);
    map.put("P_COD_CLIE_DEST",codClieDest);
    map.put("P_TIP_PROC",tipProc);
    map.put("P_COD_SUCU_HTB",codSucuHtb);
    map.put("P_NUM_CATE_NIVE",numCateNive);
    int numNive = 0;
    try{
        sqlMapClient.queryForObject("getNextNivAuto",map);
        numNive = (Integer)map.get("S_NUM_NIVE");
    }catch(Exception e){
        logger.error(e);
        numNive = 0;
    }finally{
      return numNive;      
    }
  }
  
  public List getListUsuaCliente(int codSucuHTB, int codClie,int indCorp){
    List list = new ArrayList();
    Map map = new HashMap();
    map.put("P_COD_SUCU_HTB",codSucuHTB);
    map.put("P_COD_CLIE",codClie);
    map.put("P_IND_CORP",indCorp);
    int erro = 0;
    try{
        sqlMapClient.queryForObject("getListUsuaCliente",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro==0)
            list=(List)map.get("S_LIST");
        else
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
    }finally{
        return list;      
    }
  }  
  
  public List getUsuConfNiv(int codNiveAuto, int codSucuHTB, int codClieOrig, int codClieDest, int numNive, int tipProc){
    List list = new ArrayList();
    Map map = new HashMap();
    map.put("P_COD_NIVE_AUTO",codNiveAuto);
    map.put("P_COD_SUCU_HTB",codSucuHTB);
    map.put("P_COD_CLIE_ORIG",codClieOrig);
    map.put("P_COD_CLIE_DEST",codClieDest);
    map.put("P_NUM_NIVE",numNive);
    map.put("P_TIP_PROC",tipProc+"");
    int erro = 0;
    try{
        sqlMapClient.queryForObject("getUsuConfNiv",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro==0)
            list=(List)map.get("S_LIST");
        else
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
    }finally{
        return list;      
    }
  }
  
  public int saveUserNivAutConf(int codNiv, String usuWeb, String usuCrea, String compCrea){
    Map map = new HashMap();
    map.put("P_COD_NIVE_AUTO",codNiv);
    map.put("P_COD_USUA_WEB",usuWeb);
    map.put("P_COD_USUA",usuCrea);
    map.put("P_NOM_COMP",compCrea);
    int erro = 0;
    try{
        sqlMapClient.insert("saveUserNivAutConf",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro!=0)
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
        erro = 1;
    }finally{
        return erro;        
    }
  }
  
  public int actuUsuNivAutConf(int codNiv, int numSecu, String usuWeb, String usuModi,String compModi){
        Map map = new HashMap();
        map.put("P_COD_NIVE_AUTO",codNiv);
        map.put("P_NUM_USU_SECU",numSecu);
        map.put("P_COD_USUA_WEB",usuWeb);
        map.put("P_COD_USUA",usuModi);
        map.put("P_NOM_COMP",compModi);
        int erro = 0;
        try{
            sqlMapClient.insert("actuUsuNivAutConf",map);
            erro = (Integer)map.get("S_ERRO");
            if(erro!=0)
                throw new Exception(map.get("S_MENS").toString());
        }catch(Exception e){
            logger.error(e);
            erro = 1;
        }finally{
            return erro;
        }
      }
    
  public int delUsuNivAutConf(int codNiv, int numSecu, String usuModi, String compModi){
    Map map = new HashMap();
    map.put("P_COD_NIVE_AUTO",codNiv);
    map.put("P_NUM_USU_SECU",numSecu);
    map.put("P_COD_USUA",usuModi);
    map.put("P_NOM_COMP",compModi);
    int erro = 0;
    try{
        sqlMapClient.insert("delUsuNivAutConf",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro!=0)
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
        erro = 1;
    }
    return erro;
  }

  public int copyNivAutConf(int codClieOrig, int codClieDest, int codBancDest, int codSucuHtb, int codPro, String usuModi, String compModi){
    Map map = new HashMap();
    map.put("P_COD_CLIE_ORIG",codClieOrig);
    map.put("P_COD_CLIE_DEST",codClieDest);
    map.put("P_COD_BANC_DEST",codBancDest);
    map.put("P_COD_SUCU_HTB",codSucuHtb);
    map.put("P_TIP_PROC",codPro);
    map.put("P_COD_USUA",usuModi);
    map.put("P_NOM_COMP",compModi);
    int erro = 0;
    try{
        sqlMapClient.insert("copyNivAutConf",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro!=0)
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
        erro = 1;
    }finally{
        return erro;        
    }
  }
  
  public int getCodClieEleg(String listCodClie, int codClieDest, int tipProc){
    Map map = new HashMap();
    map.put("P_LIST_COD_CLIE",listCodClie);
    map.put("P_COD_CLIE_DEST",codClieDest);
    map.put("P_TIP_PROC",tipProc);
    int codClieEleg = 0;
    try{
        sqlMapClient.queryForObject("getCodClieEleg",map);
        codClieEleg = (Integer)map.get("S_COD_CLIE_ELEG");
    }catch(Exception e){
        logger.error(e);
        codClieEleg = 0;
    }finally{
      return codClieEleg;      
    }
  }
  
  public String getProcCcom(String listCodClie, int codSucuHtb){
    Map map = new HashMap();
    map.put("P_LIST_COD_CLIE",listCodClie);
    map.put("P_COD_SUCU_HTB",codSucuHtb);
    String procCcom = "";
    try{
        sqlMapClient.queryForObject("getProcCcom",map);
        procCcom = (String)map.get("S_PROC_CCOM");
    }catch(Exception e){
        logger.error(e);
        procCcom = "";
    }finally{
      return procCcom;      
    }
  }

    public Integer grabarParamGene(Integer codRazoSoci, Integer codCorp,Integer codSucu, Integer codParm,
                                   String valorLargo, String valorCorto, String usuario) {
        
      String address="";
        try {
            address = InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
          logger.error(e);
        }
        
      logger.info("metodo : grabarParamGene");
    
      logger.info("codParm: "+codParm);
      logger.info("codRazoSoci :"+codRazoSoci);
      logger.info("codSucu : "+codSucu);
      logger.info("codCorp :"+codCorp);
      logger.info("valorLargo : "+valorLargo);
      logger.info("valorCorto :"+ valorCorto);
      logger.info("usuario :"+usuario);
      logger.info("nom_pc :"+address);

        Map map = new HashMap();
      map.put("P_COD_PARM",codParm);
      map.put("P_COD_RAZO_SOCI",codRazoSoci);
      map.put("P_COD_SUCU_HTB",codSucu);
      map.put("P_COD_CORP",codCorp);
      map.put("P_VAL_LARG",valorLargo);
      map.put("P_VAL_CORT",valorCorto);
      map.put("P_USU_WEB",usuario);
      map.put("P_NOM_COMP_MODI",address);
      int erro = 0;
      try{
          sqlMapClient.insert("grabarParamGene",map);
          erro = (Integer)map.get("S_ERRO");
          if(erro!=0)
              throw new Exception(map.get("S_MENS").toString());
      }catch(Exception e){
          logger.error(e);
          erro = 1;
      }
      return erro;
    }
  public int getNumNiveAuto(int codClieOrig, int codClieDest, int tipProc, int codSucuHtb){
    Map map = new HashMap();
    map.put("P_COD_CLIE_ORIG",codClieOrig);
    map.put("P_COD_CLIE_DEST",codClieDest);
    map.put("P_TIP_PROC",tipProc);
    map.put("P_COD_SUCU_HTB",codSucuHtb);
    int numeNiveAuto = 0;
    try{
        sqlMapClient.queryForObject("getNumNiveAuto",map);
        numeNiveAuto = (Integer)map.get("S_NUM_NIVE_AUTO");
    }catch(Exception e){
        logger.error(e);
        numeNiveAuto = 0;
    }finally{
      return numeNiveAuto;      
    }
  }
  
  public int getNiveAutoByUsua(String usuWeb, int codClieOrig, int codClieDest, int tipProc, int codSucuHtb) throws TooManyNiveAutoByUsuaException,NiveAutoNotFoundException,SQLException{
        Map map = new HashMap();
        map.put("P_USU_WEB", usuWeb);
        map.put("P_COD_CLIE_ORIG", codClieOrig);
        map.put("P_COD_CLIE_DEST", codClieDest);
        map.put("P_TIP_PROC", tipProc);
        map.put("P_COD_SUCU_HTB", codSucuHtb);
        logger.info("metodo : getNiveAutoByUsua!!!!");
        logger.info("usuWeb : "+usuWeb);
        logger.info("codClieOrig : "+codClieOrig);
        logger.info("codClieDest : "+codClieDest);
        logger.info("tipProc : "+tipProc);
        logger.info("codSucuHtb : "+codSucuHtb);
        
        
        int numNive = 0;
        int erro = 0;
        sqlMapClient.queryForObject("getNiveAutoByUsua", map);
        numNive = (Integer)map.get("S_NIVE_AUTO");
        erro = (Integer)map.get("S_ERRO");
        logger.info("numero de error es "+erro);
        if(erro==1)
            throw new SQLException((String)map.get("S_MENS"));
        if(erro==2)
            throw new TooManyNiveAutoByUsuaException((String)map.get("S_MENS"));
        if(erro==3)
            throw new NiveAutoNotFoundException((String)map.get("S_MENS"));
        return numNive;
    }
  
  public List<UsersNivConfBean> getListUsersByProcAndClie(int codClieOrig, int codClieDest, int codSucuHtb, int codPro) throws Exception{
        Map map = new HashMap();
        List<UsersNivConfBean> list=new ArrayList<UsersNivConfBean>();
        try{
            map.put("P_COD_CLIE_ORIG",codClieOrig);
            map.put("P_COD_CLIE_DEST",codClieDest);
            map.put("P_COD_SUCU_HTB",codSucuHtb);
            map.put("P_TIP_PROC",codPro);
            sqlMapClient.queryForObject("getListUsersByProcAndClie",map);
            
            int erro = (Integer)map.get("S_ERRO");
            String s_mens = (String)map.get("S_MENS");
            if(erro==0){
                list = (List)map.get("S_LIST");     
            }else
                throw new Exception(s_mens);
        }catch(Exception e){
            logger.error(e);          
        }
        return list;
  }
  
}
